#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/*
选择排序是最简单的一种基于O（n2）时间复杂度的排序算法，
基本思想是从i=0位置开始到
i=n-1每次通过内循环找出i位置到n-1位置的最小（大）值。
*/
void selectSort(int arr[], int num)
{
    //总共要比多少趟
    for (int i = 0; i < num - 1; i++)
    {
        //minNum存储当前这一趟最小值位置
        int minNum = i, temp;
        //这个循环的目的是为了寻找待排序位置的最小值
        //j代表的此次排序这趟最小值位置之后的位置
        for (int j = i + 1; j < num; j++)
        {
            printf("%d", j);
            //如果后面的元素有比当前的最小值位置小的，就把位置赋值给minNum
            if (arr[minNum] > arr[j])
            {
                minNum = j;
            }
        }
        //如果发现minNum的值不是初始位置，而是后面有值比他小就换
        if (minNum != i)
        {
            temp = arr[i];
            arr[i] = arr[minNum];
            arr[minNum] = temp;
        }
        printf("\n");
    }
}

void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void main()
{
    int arr[10] = {2, 5, 6, 4, 3, 7, 9, 8, 1, 0};
    printArray(arr, 10);
    selectSort(arr, 10);
    printArray(arr, 10);
    return;
}
/*
如实现所示，简单的选择排序复杂度固定为O(n2)，
每次内循环找出没有排序数列中的最小值，
然后跟当前数据进行交换。由于选择排序通过查找最值的方式排序，
循环次数几乎是固定的，一种优化方式是每次循环同时
查找最大值和最小值可以是循环次数减少为（n/2），
只是在循环中添加了记录最大值的操作，原理一样。
*/